home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
dskut
/
fdform18.zip
/
FDREAD.ASM
< prev
next >
Wrap
Assembly Source File
|
1991-07-21
|
25KB
|
477 lines
page 68,129
IFIS286 MACRO cp,i
IFIDN <CP>,</$G+>
ENDM
IFIS88 MACRO cp,i
IFIDN <CP>,</$G->
ENDM
IFNDEF CPU
%out No CPU defined for Assembly, defaulting to 286
CPU EQU </$G+>
ENDIF
IFIS286 %CPU
.286
ENDIF
title fdread - lesen von disketten aller formate
.radix 10
startadr equ 0ff80h
cseg segment use16 word public 'code'
assume cs:cseg,ds:nothing,es:nothing,ss:nothing
org 0
lex equ offset end_hdr-offset int13_2
lex2 equ (lex+15)/16
lex3 equ offset begin-offset start
lex4 equ (lex3+15)/16
int13_2 label dword ;HMA Einsprung INT13
int13_2ofs dw entry ;Offset-Teil
int13_2seg dw ? ;Segment-Teil
xms label dword ;Speicher für XMS-Einsprungaddresse
xms_ofs dw ?
xms_seg dw ?
.286 ;Der folgende Teil wird nur bei 286+ relevant
int13_1 proc far ;INT-09 Handler
pusha ;Alle Register retten
mov ah,7 ;Code für A20 testen
call dword ptr xms ;Rufe XMS-Manager auf
dec ax ;Ist A20 enabled (Ja: AX=1)
jz ret1 ;Wenn, ja ist hier alles erledigt
mov ah,5 ;Code für A20 local enablen
call dword ptr xms ;Rufe XMS-Manager auf
ret1: popa ;Alle Register wiederherstellen
jmp int13_2 ;Führe den eigentlichen Handler aus
int13_1 endp
.8086
end_hdr:
org startadr
start:
IFIS286 %CPU
even
.286
ENDIF
old13 label dword ;Speicherung des alten Interrupt 13
old13_ofs dw ? ;Offset-Teil
old13_seg dw ? ;Segment-Teil
oldsec db ?
entry proc far
push ax ;AX retten
or ah,ah ;Wurde Funktion 0 RESET aufgerufen?
jz donothing ;Ja, dann Ende
cmp ah,4 ;Wurde Funktion über 4 aufgerufen?
ja donothing ;Ja, dann Ende
cmp dl,3
ja donothing
push bx ;...Register...
push ds ;...retten
IFIS286 %CPU
push 0
ELSE
xor bx,bx
push bx
ENDIF
pop ds
lds bx,ds:[78h] ;Disk-Parameter Tabelle in DS:BX
mov al,ds:[bx+4]
mov oldsec,al
mov byte ptr ds:[bx+4],1Bh ;Setze auf maximal 25 Sektoren/Spur
IFIS286 %CPU
or ch,ch ;Track 0 ?
jz exit ;Ja, dann Ende
ENDIF
pop ds ;Alle...
pop bx ;...Register...
pop ax ;...zurückholen.
push ax ;AX für später speichern
pushf ;Flags pushen da INT-CALL
call old13 ;Alten INT 13 aufrufen
IFIS286 %CPU
jnc okexit ;Kein Fehler, dann Ende
pop ax ;Hole uns AX zurück
push ds ;Speichere...
push bx ;...DS & BX
push 40h ;BIOS-Data Segment...
pop ds ;...nach DS
mov bx,90h ;Beginn der Drive-Tabelle
add bl,dl ;Offset des Laufwerks
cmp ch,43 ;Track>43
ja nodstep ;Ja, dann niemals DSTEP
xor byte ptr ds:[bx],20h ;invertiere das Stepper-Bit
jmp short stepend ;Ende vom Stepping
nodstep: and byte ptr ds:[bx],0dfh ;Kein Double-Stepping
stepend: pop bx ;Hole BX und..
pop ds ;...DS zurück
jmp short endrout2 ;Routine zu Ende
exit: pop ds ;Hole alle benutzten...
pop bx ;...Register...
pop ax ;...wieder zurück
endrout2: pushf
endrout: call old13 ;Springe an den alten Interrupt 13
push ax
ENDIF
okexit: push ax
push bx
push ds
IFIS286 %CPU
push 0
ELSE
xor bx,bx
push bx
ENDIF
pop ds
lds bx,ds:[78h] ;Disk-Parameter Tabelle in DS:BX
mov al,oldsec
mov ds:[bx+4],al
pop ds
pop bx
pop ax
inc sp ;Werfe den...
inc sp ;...gesicherten AX weg
ret 2 ;Und Ende mit original Flags
donothing: pop ax
jmp old13
entry endp
begin:
cseg ends
iseg segment use16 para public 'code'
assume cs:iseg,ds:iseg ;Assembler die...
assume es:cseg,ss:sseg ;...Segment Register mitteilen
umbok dw ?
loadseg dw cseg
begin2:
push cs ;
pop ds ;DS=CS
mov dx,offset texthallo ;Begruessungstext in DX
mov ah,9 ;Ausgabe...
int 21h ;...über DOS
mov ah,30h ;Hole...
int 21h ;...die DOS-Version
xchg ah,al ;AH und AL vertauschen
cmp ax,314h ;Ist es mindestens DOS 3.20
jae versionok ;Ja, Ok
mov dx,offset textdosbad ;Sonst leider Pech
mov ah,9 ;Und Meldung...
int 21h ;...ausgeben
mov ax,4c04h ;Fehlernummer 4
int 21h ;Und Ende
include cputest.asm
versionok:
IFIS286 %CPU
call MachineCheck
cmp ax,1
jnz cpuok
mov dx,offset textlp
mov ah,9
int